#include <stdio.h>
#include <stdlib.h>

/**
 * 查找有序数组中第一个大于等于目标值的元素位置
 * @param a 有序数组（假设为非递减排序）
 * @param n 数组元素个数
 * @param key 要查找的目标值
 * @return 第一个大于等于key的元素索引，若所有元素都小于key则返回n
 */
int lower_bound(const int* a, int n, int key) {
    int l = 0, r = n;               // 定义查找范围为左闭右开区间 [l, r)
    // 当查找范围不为空时继续循环
    while (l < r) {
        // 计算中间位置，避免(l + r)可能导致的整数溢出
        int mid = l + (r - l) / 2;
        // 如果中间元素大于等于目标值，缩小右边界
        if (a[mid] >= key) 
            r = mid;
        // 否则缩小左边界
        else 
            l = mid + 1;
    }
    // 循环结束时，l == r，即为第一个大于等于key的位置
    return l;
}

int main(void) {
    int N;
    // 读取数组元素个数，若读取失败则退出程序
    if (scanf("%d", &N) != 1) return 0;   
    // 处理无效的数组大小（负数）
    if (N < 0) return 0;
    
    int* a = NULL;
    // 当数组大小大于0时，动态分配内存并读取数组元素
    if (N > 0) {
        a = (int*)malloc(sizeof(int) * (size_t)N);
        // 内存分配失败则退出程序
        if (!a) return 0;
        // 逐个读取数组元素，若读取失败则释放内存并退出
        for (int i = 0; i < N; ++i) {
            if (scanf("%d", &a[i]) != 1) { 
                free(a); 
                return 0; 
            }
        }
    }

    int T;
    // 读取查询次数，若读取失败则释放内存并退出
    if (scanf("%d", &T) != 1) { 
        free(a); 
        return 0; 
    }
    
    // 处理每次查询
    for (int i = 0; i < T; ++i) {
        int key;
        // 读取当前查询的目标值，若读取失败则释放内存并退出
        if (scanf("%d", &key) != 1) { 
            free(a); 
            return 0; 
        }
        // 查找第一个大于等于key的位置
        int pos = lower_bound(a, N, key);
        // 若找到等于key的元素，则输出其1-based索引（位置+1）
        if (pos < N && a[pos] == key) 
            printf("%d", pos + 1);
        // 未找到则输出-1
        else 
            printf("-1");
        // 除最后一个结果外，每个结果后添加空格分隔
        if (i + 1 < T) 
            putchar(' ');
    }
    // 所有结果输出完毕后换行
    putchar('\n');
    // 释放动态分配的数组内存
    free(a);
    return 0;
}